package cjyyp.eventloop组件;

import io.netty.channel.EventLoop;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.EventExecutor;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * 事件循环对象
 *
 * EventLoop 本质是一个单线程执行器（同时维护了一个 Selector），里面有 run 方法处理 Channel 上源源不断的 io 事件。
 *
 * 它的继承关系比较复杂
 *
 * * 一条线是继承自 j.u.c.ScheduledExecutorService 因此包含了线程池中所有的方法
 * * 另一条线是继承自 netty 自己的 OrderedEventExecutor，
 *   * 提供了 boolean inEventLoop(Thread thread) 方法判断一个线程是否属于此 EventLoop
 *   * 提供了 parent 方法来看看自己属于哪个 EventLoopGroup
 *
 *
 *
 * 事件循环组
 *
 * EventLoopGroup 是一组 EventLoop，Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop，后续这个 Channel 上的 io 事件都由此 EventLoop 来处理（保证了 io 事件处理时的线程安全）
 *
 * * 继承自 netty 自己的 EventExecutorGroup
 *   * 实现了 Iterable 接口提供遍历 EventLoop 的能力
 *   * 另有 next 方法获取集合中下一个 EventLoop
 */
@Slf4j
public class eventloop常用api {
    public static void main(String[] args) {
        //可以处理：io事件，普通事件，定时事件
        EventLoopGroup group=new NioEventLoopGroup(2);
        //得到下一个EventLoop对象
        System.out.println(group.next());
        System.out.println(group.next());
        //遍历
        for (EventExecutor eventExecutor : group) {
            System.out.println(eventExecutor);
        }
        //提交普通任务
        EventLoop eventLoop1 = group.next();
        eventLoop1.submit(()->{
            log.info("执行普通任务");
        });
        //提交定时任务
        EventLoop eventLoop2 = group.next();
        eventLoop2.scheduleAtFixedRate(()->{
            log.info("执行定时任务");
        },0,1, TimeUnit.SECONDS);

    }
}
